package com.snj.test2507;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class RandomDecimal {

    public static void main(String[] args) {
        BigDecimal baseNumber1 = new BigDecimal("1");
        BigDecimal baseNumber2 = new BigDecimal("1.092");

        int flag = 989;

        List<BigDecimal> list = generateRandomNumbers(30, flag);
        for (BigDecimal multiplier : list) {
            BigDecimal inputNumber1 = calculateInputNumber(baseNumber1, multiplier);
            List<BigDecimal> randomNumbers1 = generateRandomDecimals(inputNumber1, 1, generateRandomNumber());
            randomNumbers1.forEach(System.out::println);
        }

        System.out.println("------------------------------------------");

        for (BigDecimal multiplier : list) {
            BigDecimal inputNumber2 = calculateInputNumber(baseNumber2, multiplier);
            List<BigDecimal> randomNumbers2 = generateRandomDecimals(inputNumber2, 1, generateRandomNumber2());
            randomNumbers2.forEach(System.out::println);
        }
    }

    // 计算 inputNumber 的方法
    public static BigDecimal calculateInputNumber(BigDecimal baseNumber, BigDecimal multiplier) {
        return baseNumber.multiply(multiplier);
    }

    /**
     * 生成10个随机小数，范围在输入数的±5%之间，保留三位小数
     *
     * @param inputNumber 输入的小数
     * @return 包含10个随机小数的数组
     */
    public static List<BigDecimal> generateRandomDecimals(BigDecimal inputNumber, Integer size, Integer num) {
        // 计算范围
        // 下限：输入数的95%
        BigDecimal lowerBound = inputNumber.multiply(new BigDecimal("0.95"));
        // 上限：输入数的105%
        BigDecimal upperBound = inputNumber.multiply(new BigDecimal("1.05"));

        // 生成10个随机小数
        Random random = new Random();
        List<BigDecimal> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            // 生成随机小数
            double randomValue = lowerBound.doubleValue() +
                    (upperBound.doubleValue() - lowerBound.doubleValue()) * random.nextDouble();
            // 保留三位小数
            BigDecimal randomNumber = new BigDecimal(randomValue).setScale(num, RoundingMode.HALF_UP);
            list.add(randomNumber);
        }

        return list;
    }

    public static List<BigDecimal> generateRandomDecimals2(BigDecimal inputNumber, Integer size, Integer num) {
        // 计算范围
        // 下限：输入数的95%
        BigDecimal lowerBound = inputNumber.multiply(new BigDecimal("0.95"));
        // 上限：输入数的105%
        BigDecimal upperBound = inputNumber.multiply(new BigDecimal("1.05"));

        // 生成10个随机小数
        Random random = new Random();
        List<BigDecimal> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            // 生成随机小数
            double randomValue = lowerBound.doubleValue() +
                    (upperBound.doubleValue() - lowerBound.doubleValue()) * random.nextDouble();
            // 保留三位小数
            BigDecimal randomNumber = new BigDecimal(randomValue).setScale(num, RoundingMode.HALF_UP);
            list.add(randomNumber);
        }

        return list;
    }

    /**
     * 生成随机数的方法
     *
     * @param count 返回的随机数数量
     * @return 包含随机数的列表
     */
    public static List<BigDecimal> generateRandomNumbers(int count, int flag) {
        if (count <= 0) {
            throw new IllegalArgumentException("参数 count 必须大于 0");
        }

        Random random = new Random();
        List<BigDecimal> randomNumbers = new ArrayList<>();

        // 整数占据大部分，假设 70% 是整数，30% 是小数
        int integerCount = (int) (count * 0.7);
        int decimalCount = count - integerCount;

        // 生成整数部分
        for (int i = 0; i < integerCount; i++) {
            int intValue = random.nextInt(flag) + 1; // 生成 1 到 1499 的整数
            randomNumbers.add(new BigDecimal(intValue));
        }

        // 生成小数部分
        for (int i = 0; i < decimalCount; i++) {
            double decimalValue = 1 + random.nextDouble() * flag; // 生成 1 到 1500 的小数
            BigDecimal decimalNumber = new BigDecimal(decimalValue).setScale(1, RoundingMode.HALF_UP); // 保留 1 位小数
            randomNumbers.add(decimalNumber);
        }

        return randomNumbers;
    }

    /**
     * 生成 0, 1, 2, 3 的随机数，其中 3 的概率最小
     *
     * @return 随机数
     */
    public static int generateRandomNumber() {
        Random random = new Random();
        // 定义权重：0, 1, 2 的概率较高，3 的概率最小
        int[] weights = {50, 30, 20}; // 权重总和为 100
        int randomValue = random.nextInt(100); // 生成 0 到 99 的随机数

        // 根据权重范围返回对应的数字
        if (randomValue < weights[0]) {
            return 0;
        } else if (randomValue < weights[0] + weights[1]) {
            return 1;
        } else {
            return 2;
        }
    }

    public static int generateRandomNumber2() {
        Random random = new Random();
        // 定义权重：0, 1, 2 的概率较高，3 的概率最小
        int[] weights = {10, 40, 40, 10}; // 权重总和为 100
        int randomValue = random.nextInt(100); // 生成 0 到 99 的随机数

        // 根据权重范围返回对应的数字
        if (randomValue < weights[0]) {
            return 0;
        } else if (randomValue < weights[0] + weights[1]) {
            return 1;
        } else if (randomValue < weights[0] + weights[1] + weights[2]) {
            return 2;
        } else {
            return 3;
        }
    }
}